package com.example.ccj.b.a;

import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Vibrator;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;


import com.example.ccj.R;
import com.example.ccj.b.c.dialog.LoadingDialog;
import com.example.ccj.b.c.dialog.SureOrCancelDialog;
import com.example.ccj.u.LogUtils;
import com.example.ccj.u.StringUtils;
import com.example.ccj.u.media.IPictureSelectResultListener;
import com.example.ccj.u.media.MediaUtils;
import com.luck.picture.lib.entity.LocalMedia;

import java.util.ArrayList;

import cn.bingoogolapple.qrcode.core.BarcodeType;
import cn.bingoogolapple.qrcode.core.QRCodeView;
import cn.bingoogolapple.qrcode.zxing.ZXingView;

/**
 * 扫码
 * isContinuity  是否连扫
 * codeType      扫描后的解析类型  0为二维码或条码  1为发票
 */
public class ScanCodeActivity  extends BaseActivity implements QRCodeView.Delegate{
    private static final String TAG = "ScanCodeActivity";
    private ZXingView mZXingView;
    private TextView resultText;
    private boolean isContinuity = false;//是否连扫
    private int codeType = 0;//是否扫描发票
    public static final String RESULT_SCAN_CODE = "scanCode";
    public static final String RESULT_SCAN_PT = "scanCodePT";
    private LoadingDialog speedDialog;


    @Override
    public void initData(@Nullable Bundle bundle) {

    }

    @Override
    public void initView(@Nullable Bundle savedInstanceState, @Nullable View contentView) {
        setSupportActionBar(findViewById(R.id.toolbar));
        getPower();

    }

    @Override
    public int initContentView() {
        return R.layout.activity_scan_code;
    }

    protected void onInit() {
        isContinuity =  getIntent().getBooleanExtra("isContinuity",false);
        codeType =  getIntent().getIntExtra("codeType",0);
        mZXingView = findViewById(R.id.zxing_scan_code_view);
        mZXingView.setDelegate(this);
        speedDialog = new LoadingDialog(this);

        ImageView flash = findViewById(R.id.flash);
        ImageView selectImg = findViewById(R.id.select_img);
        ImageView qrCodeImg = findViewById(R.id.qr_code_img);
        ImageView barCodeImg = findViewById(R.id.bar_code_img);

        LinearLayout barCode = findViewById(R.id.bar_code);
        LinearLayout qrCode = findViewById(R.id.qr_code);
        resultText = findViewById(R.id.result_text);


        selectImg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MediaUtils mediaUtils= new MediaUtils();
                mediaUtils.pickAPictureOrCamera(v.getContext(), new ArrayList<>(), new IPictureSelectResultListener() {
                    @Override
                    public void onResult(ArrayList<LocalMedia> result) {
                        if (!result.isEmpty()) {
                            mZXingView.decodeQRCode(result.get(0).getRealPath());
                        }
                    }
                });
            }
        });

        flash.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (flashIsOpen) {
                    flash.setImageResource(R.mipmap.flash_grey);
                    flashIsOpen = false;
                    mZXingView.closeFlashlight(); // 关闭闪光灯
                } else {
                    flash.setImageResource(R.mipmap.flash);
                    flashIsOpen = true;
                    mZXingView.openFlashlight(); // 打开闪光灯
                }
            }
        });

        barCode.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (barCodeIsOpen) {
                    barCodeImg.setImageResource(R.mipmap.bar_code_grey);
                    barCodeIsOpen = false;
                    mZXingView.changeToScanQRCodeStyle(); // 切换成扫描二维码样式
                    mZXingView.setType(BarcodeType.ALL, null); // 识别所有类型的码
                    mZXingView.startSpotAndShowRect(); // 显示扫描框，并开始识别
                } else {
                    if (qrCodeIsOpen) {
                        qrCodeImg.setImageResource(R.mipmap.qr_code_grey);
                        qrCodeIsOpen = false;
                    }
                    barCodeImg.setImageResource(R.mipmap.bar_code);
                    barCodeIsOpen = true;
                    mZXingView.changeToScanBarcodeStyle(); // 切换成扫描条码样式
                    mZXingView.setType(BarcodeType.ONE_DIMENSION, null); // 只识别一维条码
                    mZXingView.startSpotAndShowRect(); // 显示扫描框，并开始识别
                }
            }
        });

        qrCode.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (qrCodeIsOpen) {
                    qrCodeImg.setImageResource(R.mipmap.qr_code_grey);
                    qrCodeIsOpen = false;
                    mZXingView.changeToScanQRCodeStyle(); // 切换成扫描二维码样式
                    mZXingView.setType(BarcodeType.ALL, null); // 识别所有类型的码
                    mZXingView.startSpotAndShowRect(); // 显示扫描框，并开始识别
                } else {
                    if (barCodeIsOpen) {
                        barCodeImg.setImageResource(R.mipmap.bar_code_grey);
                        barCodeIsOpen = false;
                    }
                    qrCodeImg.setImageResource(R.mipmap.qr_code);
                    qrCodeIsOpen = true;
                    mZXingView.changeToScanQRCodeStyle(); // 切换成扫描二维码样式
                    mZXingView.setType(BarcodeType.HIGH_FREQUENCY, null); // 只识别高频率格式，包括 QR_CODE、UPC_A、EAN_13、CODE_128
                    mZXingView.startSpotAndShowRect(); // 显示扫描框，并开始识别
                }
            }
        });

        mZXingView.startCamera(); // 打开后置摄像头开始预览，但是并未开始识别
//        mZXingView.startCamera(Camera.CameraInfo.CAMERA_FACING_FRONT); // 打开前置摄像头开始预览，但是并未开始识别
        mZXingView.startSpotAndShowRect(); // 显示扫描框，并开始识别
    }

    private boolean flashIsOpen = false;
    private boolean barCodeIsOpen = false;
    private boolean qrCodeIsOpen = false;


    @Override
    protected void onStart() {
        super.onStart();
    }

    @Override
    protected void onStop() {
        mZXingView.stopCamera(); // 关闭摄像头预览，并且隐藏扫描框
        super.onStop();
    }

    @Override
    protected void onDestroy() {
        mZXingView.onDestroy(); // 销毁二维码扫描控件
        super.onDestroy();
    }

    //震动
    private void vibrate() {
        Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
        vibrator.vibrate(100);
    }

    @Override
    public void onScanQRCodeSuccess(String result) {

        if (result != null) {
            resultText.setText(result);
        }

        vibrate();//扫描到震动
        mZXingView.stopSpot();//停止扫描
//        mZXingView.startSpot(); // 开始识别
        LogUtils.d(TAG, "onScanQRCodeSuccess() 扫描到的字符串: " + result);
        //如果规定必须扫描发票，解析发票
        if (codeType == 1) {
            if (!jiaoYanFaPiao(result)) return;
        }
        //扫描成功返回扫描到的字符串
        if (isContinuity) {
            mZXingView.startSpot(); // 开始识别
        } else {
            Intent intent = new Intent();
            intent.putExtra(RESULT_SCAN_CODE,result);
            setResult(Activity.RESULT_OK,intent);
            finish();
        }
    }

    private boolean jiaoYanFaPiao(String result){
        if (result == null) {
            //扫描失败提示并重新扫描
            tipDialog("扫描结果：null");
            return false;
        }
        String[] split = result.split(",");

        LogUtils.d(TAG, "onScanQRCodeSuccess() 扫描到的的长度: " + split.length);
        LogUtils.d(TAG, "onScanQRCodeSuccess() 扫描到的字符串: " + result);

        if (split.length == 8) {
            if (StringUtils.isEmpty(split[1])) {
                tipDialog("未获取到发票类型l");
                return false;
            }
            
            if (StringUtils.isEmpty(split[2])) {
                tipDialog("未获取到发票代码");
                return false;
            }
            if (StringUtils.isEmpty(split[3])) {
                tipDialog("未获取到发票号码");
                return false;
            }

            //类型为11的发票不验证日期和校验码
            if (!split[1].equals("11")) {
                if (StringUtils.isEmpty(split[5])) {
                    tipDialog("未获取到发票日期");
                    return false;
                }
                if (StringUtils.isEmpty(split[6])) {
                    tipDialog("未获取到发票校验码");
                    return false;
                }
            }

            try {
                Double.parseDouble(split[4]);
            } catch (Exception e) {
                //扫描失败提示并重新扫描
                tipDialog("获取开票金额失败：扫描到的信息\n"+result);
            }

        } else {
            //扫描结果分割后数量不是8个提示
            tipDialog("扫描结果：\n"+result);
            return false;
        }
        return true;
    }



    private void tipDialog(String text){
        speedDialog.dismiss();
        //扫描失败提示并重新扫描
        SureOrCancelDialog dialog = new SureOrCancelDialog(this);

        dialog.setTitleLeftIcon(R.mipmap.def_dialog_error);
        dialog.setTitleCenterText("扫描失败");
        dialog.setCenterText(text).setTextColor(Color.RED);
        dialog.setButtonSureText("重新扫描").setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
                mZXingView.startSpot(); // 开始识别
            }
        });

        dialog.setButtonCancelText("退出").setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
                finish();
            }
        });
        dialog.show();
    }


    @Override
    public void onCameraAmbientBrightnessChanged(boolean isDark) {
        // 这里是通过修改提示文案来展示环境是否过暗的状态，接入方也可以根据 isDark 的值来实现其他交互效果
        String tipText = mZXingView.getScanBoxView().getTipText();
        String ambientBrightnessTip = "\n环境过暗，请打开闪光灯";
        if (isDark) {
            if (!tipText.contains(ambientBrightnessTip)) {
                mZXingView.getScanBoxView().setTipText(tipText + ambientBrightnessTip);
            }
        } else {
            if (tipText.contains(ambientBrightnessTip)) {
                tipText = tipText.substring(0, tipText.indexOf(ambientBrightnessTip));
                mZXingView.getScanBoxView().setTipText(tipText);
            }
        }
    }

    public void onClick(View v) {
//        switch (v.getId()) {
//            case R.id.start_preview:
//                mZXingView.startCamera(); // 打开后置摄像头开始预览，但是并未开始识别
//                break;
//            case R.id.stop_preview:
//                mZXingView.stopCamera(); // 关闭摄像头预览，并且隐藏扫描框
//                break;
//            case R.id.start_spot:
//                mZXingView.startSpot(); // 开始识别
//                break;
//            case R.id.stop_spot:
//                mZXingView.stopSpot(); // 停止识别
//                break;
//            case R.id.start_spot_showrect:
//                mZXingView.startSpotAndShowRect(); // 显示扫描框，并且开始识别
//                break;
//            case R.id.stop_spot_hiddenrect:
//                mZXingView.stopSpotAndHiddenRect(); // 停止识别，并且隐藏扫描框
//                break;
//            case R.id.show_scan_rect:
//                mZXingView.showScanRect(); // 显示扫描框
//                break;
//            case R.id.hidden_scan_rect:
//                mZXingView.hiddenScanRect(); // 隐藏扫描框
//                break;
//            case R.id.decode_scan_box_area:
//                mZXingView.getScanBoxView().setOnlyDecodeScanBoxArea(true); // 仅识别扫描框中的码
//                break;
//            case R.id.decode_full_screen_area:
//                mZXingView.getScanBoxView().setOnlyDecodeScanBoxArea(false); // 识别整个屏幕中的码
//                break;
//            case R.id.open_flashlight:
//                mZXingView.openFlashlight(); // 打开闪光灯
//                break;
//            case R.id.close_flashlight:
//                mZXingView.closeFlashlight(); // 关闭闪光灯
//                break;
//            case R.id.scan_one_dimension:
//                mZXingView.changeToScanBarcodeStyle(); // 切换成扫描条码样式
//                mZXingView.setType(BarcodeType.ONE_DIMENSION, null); // 只识别一维条码
//                mZXingView.startSpotAndShowRect(); // 显示扫描框，并开始识别
//                break;
//            case R.id.scan_two_dimension:
//                mZXingView.changeToScanQRCodeStyle(); // 切换成扫描二维码样式
//                mZXingView.setType(BarcodeType.TWO_DIMENSION, null); // 只识别二维条码
//                mZXingView.startSpotAndShowRect(); // 显示扫描框，并开始识别
//                break;
//            case R.id.scan_qr_code:
//                mZXingView.changeToScanQRCodeStyle(); // 切换成扫描二维码样式
//                mZXingView.setType(BarcodeType.ONLY_QR_CODE, null); // 只识别 QR_CODE
//                mZXingView.startSpotAndShowRect(); // 显示扫描框，并开始识别
//                break;
//            case R.id.scan_code128:
//                mZXingView.changeToScanBarcodeStyle(); // 切换成扫描条码样式
//                mZXingView.setType(BarcodeType.ONLY_CODE_128, null); // 只识别 CODE_128
//                mZXingView.startSpotAndShowRect(); // 显示扫描框，并开始识别
//                break;
//            case R.id.scan_ean13:
//                mZXingView.changeToScanBarcodeStyle(); // 切换成扫描条码样式
//                mZXingView.setType(BarcodeType.ONLY_EAN_13, null); // 只识别 EAN_13
//                mZXingView.startSpotAndShowRect(); // 显示扫描框，并开始识别
//                break;
//            case R.id.scan_high_frequency:
//                mZXingView.changeToScanQRCodeStyle(); // 切换成扫描二维码样式
//                mZXingView.setType(BarcodeType.HIGH_FREQUENCY, null); // 只识别高频率格式，包括 QR_CODE、UPC_A、EAN_13、CODE_128
//                mZXingView.startSpotAndShowRect(); // 显示扫描框，并开始识别
//                break;
//            case R.id.scan_all:
//                mZXingView.changeToScanQRCodeStyle(); // 切换成扫描二维码样式
//                mZXingView.setType(BarcodeType.ALL, null); // 识别所有类型的码
//                mZXingView.startSpotAndShowRect(); // 显示扫描框，并开始识别
//                break;
//            case R.id.scan_custom:
//                mZXingView.changeToScanQRCodeStyle(); // 切换成扫描二维码样式
//
//                Map<DecodeHintType, Object> hintMap = new EnumMap<>(DecodeHintType.class);
//                List<BarcodeFormat> formatList = new ArrayList<>();
//                formatList.add(BarcodeFormat.QR_CODE);
//                formatList.add(BarcodeFormat.UPC_A);
//                formatList.add(BarcodeFormat.EAN_13);
//                formatList.add(BarcodeFormat.CODE_128);
//                hintMap.put(DecodeHintType.POSSIBLE_FORMATS, formatList); // 可能的编码格式
//                hintMap.put(DecodeHintType.TRY_HARDER, Boolean.TRUE); // 花更多的时间用于寻找图上的编码，优化准确性，但不优化速度
//                hintMap.put(DecodeHintType.CHARACTER_SET, "utf-8"); // 编码字符集
//                mZXingView.setType(BarcodeType.CUSTOM, hintMap); // 自定义识别的类型
//
//                mZXingView.startSpotAndShowRect(); // 显示扫描框，并开始识别
//                break;
//            case R.id.choose_qrcde_from_gallery:
//                /*
//                从相册选取二维码图片，这里为了方便演示，使用的是
//                https://github.com/bingoogolapple/BGAPhotoPicker-Android
//                这个库来从图库中选择二维码图片，这个库不是必须的，你也可以通过自己的方式从图库中选择图片
//                 */
//                Intent photoPickerIntent = new BGAPhotoPickerActivity.IntentBuilder(this)
//                        .cameraFileDir(null)
//                        .maxChooseCount(1)
//                        .selectedPhotos(null)
//                        .pauseOnScroll(false)
//                        .build();
//                startActivityForResult(photoPickerIntent, REQUEST_CODE_CHOOSE_QRCODE_FROM_GALLERY);
//                break;
//        }
    }


    @Override
    public void onScanQRCodeOpenCameraError() {
        LogUtils.e(TAG, "onScanQRCodeOpenCameraError() 扫码: " + "打开相机出错");
    }

    private static final int REQUEST_CODE_CHOOSE_QRCODE_FROM_GALLERY = 666;

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        mZXingView.startSpotAndShowRect(); // 显示扫描框，并开始识别
        if (data == null) return;
        Bundle extras = data.getExtras();
        setResult(Activity.RESULT_OK,data);

        for (String s : extras.keySet()) {
            LogUtils.d(TAG, "onActivityResult() 扫码返回的数据: " + s);
        }
        if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_CODE_CHOOSE_QRCODE_FROM_GALLERY) {
            // 本来就用到 QRCodeView 时可直接调 QRCodeView 的方法，走通用的回调
//            mZXingView.decodeQRCode(picturePath);
        }
    }
    private static final int MY_PERMISSIONS_REQUEST_CAMERA_DEVICE = 909;


    private void getPower(){
        // 检查权限
        if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED) {
            // 请求权限
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.CAMERA},
                    MY_PERMISSIONS_REQUEST_CAMERA_DEVICE);
        } else {
            // 权限已经被授予，可以继续你的操作
            onInit();
        }
    }


    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_CAMERA_DEVICE: {
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // 权限被授予，可以继续你的操作
                } else {
                    // 权限被拒绝，需要引导用户去设置中手动打开
                }
                return;
            }
        }
    }
}
